package ar.edu.utn.frba.dds.tp.code.adapter;


import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.tp.code.Asientos.AsientoDeVuelo;
import ar.edu.utn.frba.dds.tp.code.Asientos.EstadoAsiento;
import ar.edu.utn.frba.dds.tp.code.usuarios.Usuario;
import ar.edu.utn.frba.dds.tp.code.usuarios.UsuarioStandard;
import ar.edu.utn.frba.dds.tp.code.vuelos.Aerolinea;
import ar.edu.utn.frba.dds.tp.code.vuelos.Busqueda;
import ar.edu.utn.frba.dds.tp.code.vuelos.RegistroCompraAsientos;
import ar.edu.utn.frba.dds.tp.code.vuelos.Vuelo;

import com.lanchita.AerolineaLanchita;
import com.lanchita.excepciones.EstadoErroneoException;

public class LanchitaAdapter extends Aerolinea{
	
	private AerolineaLanchita aerolineaLanchita = AerolineaLanchita.getInstance();
	private LanchitaConversor conversor = new LanchitaConversor();
	private BigDecimal impuesto = new BigDecimal("0.15");
	
	@Override
	public BigDecimal getImpuesto(){
		return this.impuesto;
	}
		
	@Override
	public void comprarAsiento(AsientoDeVuelo asiento, Usuario comprador) {
		String codigo = conversor.convertirAString(asiento);
		aerolineaLanchita.comprar(codigo);
		asiento.setEstado(EstadoAsiento.COMPRADO);    //TODO: delegar a asiento lo de aca para abajo
		asiento.eliminarSobreReservantes();
		RegistroCompraAsientos.getInstance().incValue(this, asiento.getVuelo());
		//no se hace nada con el comprador, pero viene heredado para usar el 
		//mensaje polimórficamente.
	}

	@Override
	public void reservarAsiento(AsientoDeVuelo asiento, UsuarioStandard reservante){   
		String codigo = conversor.convertirAString(asiento);
		String dni = Integer.toString(reservante.getDni());
		try {
			aerolineaLanchita.reservar(codigo,dni); 
			asiento.setEstado(EstadoAsiento.RESERVADO);
		}
		catch (EstadoErroneoException e){
			asiento.agregarSobreReserva(reservante);
		}
	}
	
	public void expiroReserva(String[] asientoEnString){  // asientoEnString como los maneja lanchita 
		
		AsientoDeVuelo asiento = conversor.convertirAsiento(asientoEnString);
		transferirReserva(asiento);
	}
	
	@Override
	public List<Vuelo> vuelosDisponibles(Busqueda busqueda) {
		
		Lanchita lanchita = conversor.parsearBusqueda(busqueda);
		
		ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
		
		String[][] asientosDisponibles = aerolineaLanchita.asientosDisponibles(
				lanchita.getOrigenVuelo(),
				lanchita.getDestinoVuelo(),
				lanchita.getFechaSalida(),
				lanchita.getFechaLlegada(),
				lanchita.getHorarioSalida(),
				lanchita.getHorarioLlegada());
		
		for(String[] asientoEnString: asientosDisponibles){
			AsientoDeVuelo asientoVuelo = conversor.convertirAsiento(asientoEnString);
			this.ponerEnVuelo(asientoVuelo, vuelos);
		}
		return vuelos;
	}
	
	public LanchitaAdapter(){
		super();
	}
	
	
	
}



